/* 头文件声明区 */
#include <REGX52.H>//单片机寄存器专用头文件
#include <Key.h>//按键底层驱动专用头文件
#include <Seg.h>//数码管底层驱动专用头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

/* 变量声明区 */
unsigned char Key_Val,Key_Down,Key_Old;//按键专用变量
unsigned char Key_Slow_Down;//按键减速专用变量
unsigned char Seg_Buf[6] = {10,10,10,10,10,10};//数码管显示数据存放数组
unsigned char Seg_Pos;//数码管扫描专用变量
unsigned int Seg_Slow_Down;//数码管减速专用变量
uchar Seg_Point[6]={0,0,0,0,0,0};
uchar Seg_Mode=0;//0为模式1，1为模式2
uchar Led_Mode=0;//0为模式1，1为模式2，2为模式3，3为模式4
uint Led_Time[4]={400,400,400,400};//led四个模式的时间
uint Led_Count=0;//计时器，用以判断是否到达led轮转时间
uchar ucLed=0xfe;
uchar Led_Dis[4]={0x7e,0xbd,0xdb,0xe7};
uchar Led_Index=0;
bit Start_Flag=0;//0停1动
uint Led_Time_Set[4];
bit Seg_Set_Flag=0;//0为运行模式模块闪，1为流转间隔模块闪
bit Seg_Flash_Flag=0;//0熄灭1亮
uint Timer800Ms=0;
bit Data_Dis_Flag=0;//0正常，1进入模式3
uchar Led_Wela=0;

/* 键盘处理函数 */
void Key_Proc()
{
	uchar i;
	if(Key_Slow_Down) return;
	Key_Slow_Down = 1;//键盘减速程序

	Key_Val = Key_Read();//实时读取键码值
	Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿
	Key_Old = Key_Val;//辅助扫描变量
	
	if(Start_Flag==0){
		if(Key_Old==4 && Seg_Mode==0){
			Data_Dis_Flag=1;
		}
		else{
			Data_Dis_Flag=0;
			Seg_Point[0]=Seg_Point[1]=0;
		}
	}
	else{
		Data_Dis_Flag=0;
		Seg_Point[0]=Seg_Point[1]=0;
	}
	
	switch(Key_Down){
		case 7:
			Start_Flag^=1;
			break;
		case 6:
			if(Start_Flag==0){
				if(Seg_Mode==0){
					Seg_Set_Flag=0;
					for(i=0;i<4;i++){
						Led_Time_Set[i]=Led_Time[i];
					}
					Seg_Mode=1;						
				}
				else if(Seg_Mode==1){
					Seg_Set_Flag^=1;
					if(Seg_Mode==1 && Seg_Set_Flag==0){
						for(i=0;i<4;i++){
							Led_Time[i]=Led_Time_Set[i];
						}
						Seg_Mode=0;
						Led_Mode=0;
					}
				}
			}
			break;
		case 5:
			if(Seg_Mode==1){
				if(Seg_Set_Flag==0){
					Led_Mode++;
					if(Led_Mode==4){
						Led_Mode=0;
					}
				}
				if(Seg_Set_Flag==1){
					Led_Time_Set[Led_Mode]+=100;
					if(Led_Time_Set[Led_Mode]==1300){
						Led_Time_Set[Led_Mode]=400;
					}
				}
			}
			break;
		case 4:
			if(Seg_Mode==1){
				if(Seg_Set_Flag==0){
					Led_Mode--;
					if(Led_Mode==255){
						Led_Mode=3;
					}
				}
				if(Seg_Set_Flag==1){
					Led_Time_Set[Led_Mode]-=100;
					if(Led_Time_Set[Led_Mode]==300){
						Led_Time_Set[Led_Mode]=1200;
					}
				}
			}
			break;			
	}

}

/* 信息处理函数 */
void Seg_Proc()
{
	if(Seg_Slow_Down) return;
	Seg_Slow_Down = 1;//数码管减速程序

	switch(Seg_Mode){
		case 0:
			if(Data_Dis_Flag==0){
				Seg_Buf[0]=Start_Flag?11:12;
				Seg_Buf[1]=Led_Mode+1;
				Seg_Buf[2]=Led_Time[Led_Mode]/1000?Led_Time[Led_Mode]/1000%10:10;
				Seg_Buf[3]=Led_Time[Led_Mode]/100%10;
				Seg_Buf[4]=Led_Time[Led_Mode]/10%10;
				Seg_Buf[5]=Led_Time[Led_Mode]%10;				
			}
			else{
				Seg_Point[0]=Seg_Point[1]=1;
				Seg_Buf[0]=0;
				Seg_Buf[1]=11;
				Seg_Buf[2]=13;
				Seg_Buf[3]=Led_Mode+1;
				Seg_Buf[4]=Led_Wela/10%10;
				Seg_Buf[5]=Led_Wela%10;	
			}
			break;
		case 1:
			Seg_Buf[0]=13;
			Seg_Buf[1]=Led_Mode+1;
		  Seg_Buf[2]=Led_Time_Set[Led_Mode]/1000?Led_Time_Set[Led_Mode]/1000%10:10;
			Seg_Buf[3]=Led_Time_Set[Led_Mode]/100%10;
			Seg_Buf[4]=Led_Time_Set[Led_Mode]/10%10;
			Seg_Buf[5]=Led_Time_Set[Led_Mode]%10;
		
			if(Seg_Set_Flag==0){
				Seg_Buf[0]=Seg_Flash_Flag?13:10;
				Seg_Buf[1]=Seg_Flash_Flag?Led_Mode+1:10;
			}
			else{
				if(Led_Time_Set[Led_Mode]/1000!=0){
					Seg_Buf[2]=Seg_Flash_Flag?Led_Time_Set[Led_Mode]/1000%10:10;
					Seg_Buf[3]=Seg_Flash_Flag?Led_Time_Set[Led_Mode]/100%10:10;
					Seg_Buf[4]=Seg_Flash_Flag?Led_Time_Set[Led_Mode]/10%10:10;
					Seg_Buf[5]=Seg_Flash_Flag?Led_Time_Set[Led_Mode]%10:10;
				}
				else{
					Seg_Buf[2]=10;
					Seg_Buf[3]=Seg_Flash_Flag?Led_Time_Set[Led_Mode]/100%10:10;
					Seg_Buf[4]=Seg_Flash_Flag?Led_Time_Set[Led_Mode]/10%10:10;
					Seg_Buf[5]=Seg_Flash_Flag?Led_Time_Set[Led_Mode]%10:10;
				}												
			}
			break;
		case 2:
			Seg_Point[0]=Seg_Point[1]=1;
			Seg_Buf[0]=0xc0;
			Seg_Buf[1]=11;
			break;
	}
}

/* 其他显示函数 */
void Led_Proc()
{
	P1=ucLed;
	if(Led_Count==Led_Time[Led_Mode]){
		Led_Count=0;
		switch(Led_Mode){
			case 0:
				if(ucLed==0x7e)
					ucLed=0xfe;
				else{
					ucLed=_crol_(ucLed,1);
					if(ucLed==0x7f)
						Led_Mode++;
				}
				break;
			case 1:
				ucLed=_cror_(ucLed,1);
				if(ucLed==0xfe)
					Led_Mode++;
				break;
			case 2:
				ucLed=Led_Dis[Led_Index];
				Led_Index++;
				if(Led_Index==4){
					Led_Index=3;
					Led_Mode++;				
				}
				break;
			case 3:
				ucLed=Led_Dis[Led_Index];
				Led_Index--;
				if(Led_Index==255){
					Led_Mode=0;
					Led_Index=0;
				}
				break;
		}	
	}
	if(ucLed==0xfe)Led_Wela=1;
	if(ucLed==0xfd)Led_Wela=2;
	if(ucLed==0xfb)Led_Wela=3;
	if(ucLed==0xf7)Led_Wela=4;
	if(ucLed==0xef)Led_Wela=5;
	if(ucLed==0xdf)Led_Wela=6;
	if(ucLed==0xbf)Led_Wela=7;
	if(ucLed==0x7f)Led_Wela=8;
	
	if(ucLed==0x7e)Led_Wela=18;
	if(ucLed==0xbd)Led_Wela=27;
	if(ucLed==0xdb)Led_Wela=36;
	if(ucLed==0xe7)Led_Wela=45;
}

/* 定时器0中断初始化函数 */
void Timer0Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;        //定时器0中断打开
	EA = 1;         //总中断打开
}

/* 定时器0中断服务函数 */
void Timer0Server() interrupt 1
{
 	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值   
	if(++Key_Slow_Down == 10) Key_Slow_Down = 0;//键盘减速专用
	if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;//数码管减速专用
	if(++Seg_Pos == 6) Seg_Pos = 0;//数码管显示专用
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
	if(Start_Flag==1){
		Led_Count++;	
	}
	if(Seg_Mode==1){
		Timer800Ms++;
		if(Timer800Ms==800){
			Timer800Ms=0;
			Seg_Flash_Flag^=1;
		}
	}
}

/* Main */
void main()
{
	Timer0Init();
	while (1)
	{
		Key_Proc();
		Seg_Proc();
		Led_Proc();
	}
}